import string
import secrets
from typing import final
############################>>>指定密码得字母、数字和符号得个数<<<############################################

letters = string.ascii_letters # 获取所有字母
numbers = string.digits # 获取所有数字
symbols = string.punctuation # 获取所有符号

############################>>>用户输入指定密码的字母、数字和符号的个数<<<############################################
num_letters = int(input("请输入密码中字母的个数："))
num_numbers = int(input("请输入密码中数字的个数："))
num_symbols = int(input("请输入密码中符号的个数："))

############################>>>生成密码的字母、数字、符号的随机<<<############################################
temp_letters = (secrets.choice(letters) for _ in range (num_letters))  # 生成器推导式（生成器推导式）
temp_numbers = (secrets.choice(numbers) for _ in range (num_numbers))  # 生成器推导式（生成器推导式）
temp_symbols = (secrets.choice(symbols) for _ in range (num_symbols))  # 生成器推导式（生成器推导式）    当for i in range ()，i并不会调用，整体当作变量时，可以写位 for _ in range ()

result = "".join(temp_letters) + "".join(temp_numbers) + "".join(temp_symbols) # 将生成器推导式得结果拼接起来,最后赋值给一个变量，类型位字符串

final_password = list(result) # 将字符串类型得变量转换为列表类型
secrets.SystemRandom().shuffle(final_password) # 打乱列表中得元素顺序
my_password = "".join(final_password) # 将列表类型得变量转换为字符串类型

print(my_password)
